package com.bit.cfdi.web.domain;


import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "negocio")
public class Negocio implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public static final String ESQUEMA_2_0 = "CFD2010 V2.0";
	public static final String ESQUEMA_3_0 = "CFDI2011 V3.0";
	public static final String ESQUEMA_2_2 = "CFD2010 V2.2";
	public static final String ESQUEMA_3_2 = "CFDI2011 V3.2";

	private Long idNegocio;
	private Contacto contacto;
	private DatosFiscales datosFiscales;
	private Direccion direccion;
	private String nombre;
	private Byte[] logoNegocio;
	private String formatoLogo;
	private Byte[] negKey;
	private Byte[] negCer;
	private String numCertificado;
	private Calendar fechaCertificadoExpiracion;
	private Byte[] pfx;
	private String negPassword;	
	private Long ultimaModificacionPor;
	private Calendar fechaModificacion;
	private Integer status;
	private String esquemaSAT;
	private Set<UsuarioNegocio> usuariosNegocio = 
		new HashSet<UsuarioNegocio>(0);
	private Set<CampoExtraCliente> camposExtraCliente = 
		new HashSet<CampoExtraCliente>(0);
	private Set<HistorialCompraCreditos> historialCompraCreditos = 
		new HashSet<HistorialCompraCreditos>(0);
	private Set<Concepto> conceptos = new HashSet<Concepto>(0);/*
	private Set<Etiqueta> etiquetas = new HashSet<Etiqueta>(0);
	private Set<Leyenda> leyendas = new HashSet<Leyenda>(0);
	private Set<Descuento> descuentos = new HashSet<Descuento>(0);
	private Set<Firma> firmas = new HashSet<Firma>(0);*/
	private Set<CampoExtraComprobante> camposExtraComprobante = 
		new HashSet<CampoExtraComprobante>(0);
	private Set<Comprobante> comprobantes = new HashSet<Comprobante>(0);
	private Set<Sucursal> sucursales = new HashSet<Sucursal>(0);
	private Set<RegimenNegocio> regimenesNegocio = 
		new HashSet<RegimenNegocio>(0);
	private Set<NegocioGiro> giros = 
		new HashSet<NegocioGiro>(0);
	private Set<LicenciaSerie> licenciasSerie = 
		new HashSet<LicenciaSerie>(0);

	// Property accessors
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id_negocio", nullable = false)
	public Long getIdNegocio() {
		return idNegocio;
	}

	public void setIdNegocio(Long idNegocio) {
		this.idNegocio = idNegocio;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_contacto")
	public Contacto getContacto() {
		return contacto;
	}

	public void setContacto(Contacto contacto) {
		this.contacto = contacto;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_datos_fiscales")
	public DatosFiscales getDatosFiscales() {
		return datosFiscales;
	}

	public void setDatosFiscales(DatosFiscales datosFiscales) {
		this.datosFiscales = datosFiscales;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_direccion")
	public Direccion getDireccion() {
		return direccion;
	}

	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}

	@Column(name = "nombre", nullable = false, length = 255)
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	@Column(name = "logo_negocio", columnDefinition="LONGBLOB")
	public Byte[] getLogoNegocio() {
		return logoNegocio;
	}

	public void setLogoNegocio(Byte[] logoNegocio) {
		this.logoNegocio = logoNegocio;
	}
	
	@Column(name = "formato_logo")
	public String getFormatoLogo() {
		return formatoLogo;
	}
	
	public void setFormatoLogo(final String formatoLogo) {
		this.formatoLogo = formatoLogo;
	}

	@Column(name = "neg_key", columnDefinition="LONGBLOB")
	public Byte[] getNegKey() {
		return negKey;
	}

	public void setNegKey(Byte[] negKey) {
		this.negKey = negKey;
	}

	@Column(name = "neg_cer", columnDefinition="LONGBLOB")
	public Byte[] getNegCer() {
		return negCer;
	}

	public void setNegCer(Byte[] negCer) {
		this.negCer = negCer;
	}
	
	@Column(name = "num_certificado", length = 250)
	public String getNumCertificado() {
		return numCertificado;
	}
	
	public void setNumCertificado(String numCertificado) {
		this.numCertificado = numCertificado;
	}
	
	@Column(name = "fecha_expiracion")
	@Temporal(TemporalType.TIMESTAMP)
	public Calendar getCertificadoExpiracion() {
		return fechaCertificadoExpiracion;
	}
	
	public void setCertificadoExpiracion(Calendar fechaCertificadoExpiracion) {
		this.fechaCertificadoExpiracion = fechaCertificadoExpiracion;
	}

	@Column(name = "pfx", columnDefinition="LONGBLOB")
	public Byte[] getPFX() {
		return pfx;
	}
	
	public void setPFX(Byte[] pfx) {
		this.pfx = pfx;
	}

	@Column(name = "neg_password", length = 150)
	public String getNegPassword() {
		return negPassword;
	}

	public void setNegPassword(String negPassword) {
		this.negPassword = negPassword;
	}

	@Column(name = "ultima_modificacion_por")
	public Long getUltimaModificacionPor() {
		return ultimaModificacionPor;
	}

	public void setUltimaModificacionPor(Long ultimaModificacionPor) {
		this.ultimaModificacionPor = ultimaModificacionPor;
	}

	@Column(name = "fecha_modificacion")
	@Temporal(TemporalType.TIMESTAMP)
	@Version
	public Calendar getFechaModificacion() {
		return fechaModificacion;
	}

	public void setFechaModificacion(Calendar fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}
	
	@Column(name = "status")
	public Integer getStatus() {
		return status;
	}
	
	public void setStatus(Integer status) {
		this.status = status;
	}
	
	@Column(name = "esquema_sat")
	public String getEsquemaSAT() {
		return esquemaSAT;
	}
	
	public void setEsquemaSAT(String esquemaSAT) {
		this.esquemaSAT = esquemaSAT;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "negocio")
	public Set<UsuarioNegocio> getUsuariosNegocio() {
		return usuariosNegocio;
	}
	
	public void setUsuariosNegocio(Set<UsuarioNegocio> usuariosNegocio) {
		this.usuariosNegocio = usuariosNegocio;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<CampoExtraCliente> getCamposExtraCliente() {
		return camposExtraCliente;
	}

	public void setCamposExtraCliente(
			Set<CampoExtraCliente> camposExtraCliente) {
		this.camposExtraCliente = camposExtraCliente;
	}
	/*
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<Etiqueta> getEtiquetas() {
		return etiquetas;
	}
	
	public void setEtiquetas(final Set<Etiqueta> etiquetas) {
		this.etiquetas = etiquetas;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<Leyenda> getLeyendas() {
		return leyendas;
	}
	
	public void setLeyendas(final Set<Leyenda> leyendas) {
		this.leyendas = leyendas;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<Descuento> getDescuentos() {
		return descuentos;
	}
	
	public void setDescuentos(final Set<Descuento> descuentos) {
		this.descuentos = descuentos;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<Firma> getFirmas() {
		return firmas;
	}
	
	public void setFirmas(final Set<Firma> firmas){
		this.firmas = firmas;
	}
*/
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<CampoExtraComprobante> getCamposExtraComprobante() {
		return camposExtraComprobante;
	}

	public void setCamposExtraComprobante(
			Set<CampoExtraComprobante> camposExtraComprobante) {
		this.camposExtraComprobante = camposExtraComprobante;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "negocio")
	public Set<HistorialCompraCreditos> getHistorialCompraCreditos() {
		return historialCompraCreditos;
	}

	public void setHistorialCompraCreditos(
			Set<HistorialCompraCreditos> historialCompraCreditos) {
		this.historialCompraCreditos = historialCompraCreditos;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "negocio")
	public Set<Concepto> getConceptos() {
		return conceptos;
	}

	public void setConceptos(Set<Concepto> conceptos) {
		this.conceptos = conceptos;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "negocio")
	public Set<Comprobante> getComprobantes() {
		return comprobantes;
	}

	public void setComprobantes(Set<Comprobante> comprobantes) {
		this.comprobantes = comprobantes;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<Sucursal> getSucursales() {
		return sucursales;
	}

	public void setSucursales(Set<Sucursal> sucursales) {
		this.sucursales = sucursales;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<RegimenNegocio> getRegimenesNegocio() {
		return regimenesNegocio;
	}
	
	public void setRegimenesNegocio(Set<RegimenNegocio> regimenesNegocio) {
		this.regimenesNegocio = regimenesNegocio;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<NegocioGiro> getGiros() {
		return giros;
	}
	
	public void setGiros(Set<NegocioGiro> giros) {
		this.giros = giros;
	}
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "negocio")
	public Set<LicenciaSerie> getLicenciasSerie() {
		return licenciasSerie;
	}
	
	public void setLicenciasSerie(Set<LicenciaSerie> licenciasSerie) {
		this.licenciasSerie = licenciasSerie;
	}
}